import dayjs from "dayjs"
import { removeConfigLayout } from "@/utils/cache/local-storage"

/** 格式化时间 */
export const formatDateTime = (time: string | number | Date) => {
  return time ? dayjs(new Date(time)).format("YYYY-MM-DD HH:mm:ss") : "N/A"
}

/** 用 JS 获取全局 css 变量 */
export const getCssVariableValue = (cssVariableName: string) => {
  let cssVariableValue = ""
  try {
    // 没有拿到值时，会返回空串
    cssVariableValue = getComputedStyle(document.documentElement).getPropertyValue(cssVariableName)
  } catch (error) {
    console.error(error)
  }
  return cssVariableValue
}

/** 用 JS 设置全局 CSS 变量 */
export const setCssVariableValue = (cssVariableName: string, cssVariableValue: string) => {
  try {
    document.documentElement.style.setProperty(cssVariableName, cssVariableValue)
  } catch (error) {
    console.error(error)
  }
}

/** 重置项目配置 */
export const resetConfigLayout = () => {
  removeConfigLayout()
  location.reload()
}

/**
 * 通过对象 遍历
 * @param {Array} item 必传 需要转换成树 结构的数组
 * @return {Array} 返回数组包裹树结构对象
 * */
export function treeArr(item: any): any[] {
  let returnArr = [],
    objItem: any = {}
  for (let items of item) {
    // 给对象赋值及设置children
    // console.log(items)
    objItem[items.id] = { ...items, children: [] }
  }
  for (let items of item) {
    // 利用对象的浅拷贝的数据绑定 实现数结构效果
    let id = items.id,
      pid = items.pid,
      treeItem = objItem[id]
    if (pid == 0) {
      returnArr.push(treeItem)
    } else {
      if (!objItem[pid]) {
        objItem[pid].children = {
          children: []
        }
      }
      objItem[pid].children.push(treeItem)
    }
  }
  return returnArr
}

/**
 * 把数结构 结构成扁平数组
 * @param {Object} tree 树形数据
 * @return {Array} 返回一个扁平的数组
 */
export function findQuestions(tree: any): any[] {
  // 模拟栈，管理结点
  let stack = [tree]
  let res = []
  while (stack.length) {
    // 栈顶结点出栈
    let node = stack.pop()
    if (node.pid == "0") {
      res.push({
        ...node,
        children: []
      })
    }
    // 题组下还有组
    if (node.children && node.children.length) {
      // 存储需要的数据
      res.push(...node.children)
      // 将候选顶点入栈，进行下一次循环
      stack.push(...node.children)
    }
  }
  return res
}
// 数字小于10 追加0
const t = (i: number | string): string => ((i as number) < 10 ? "0" : "") + i

/**
 * 通过时间戳转化时间字符串格式
 * @param {number | string} time 时间戳 或者 时间格式
 * @returns {string} 返回时间格式字符串
 */
export function formatDate(time: string | number, format = "yyyy-mm-dd") {
  const d = time ? new Date(time) : new Date()
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minutes = d.getMinutes()
  const seconds = d.getSeconds()
  const weekday = d.getDay()
  function setTimeText(r: string): string {
    let str = ""
    switch (r.toUpperCase()) {
      case "YY": // 两个数年
        str = ("" + year).substr(2)
        break
      case "YYYY": // 四位数年
        str = String(year)
        break
      case "M": // 月份
        str = String(month)
        break
      case "MM": // 月份 小于10 追加0
        str = t(month)
        break
      case "D": // 天
        str = String(day)
        break
      case "DD": // 复数天 小于10 追加0
        str = t(day)
        break
      case "H": // 小时
        str = String(hour)
        break
      case "HH": // 复数小时 小于10 追加0
        str = t(hour)
        break
      case "I": // 分
        str = String(minutes)
        break
      case "II": // 复数分 小于10 追加0
        str = t(minutes)
        break
      case "S": // 秒
        str = String(seconds)
        break
      case "SS": // 复数秒 小于10 追加0
        str = String(t(seconds))
        break
      case "W": // 一周
        str = `星期${["日", "一", "二", "三", "四", "五", "六"][weekday]}`
        break
      case "WW": // 英文版 一周
        str = ["Sunday", "Monday", "TuesDay", "Wednesday", "Thursday", "Friday", "Saturday"][weekday]
        break
    }
    return str
  }
  return format.replace(/(yy){1,2}|m{1,2}|d{1,2}|h{1,2}|i{1,2}|s{1,2}|w{1,2}/gi, setTimeText)
}
/**
 * a连接下载文件
 * @parmas {url} = string 下载链接
 * @parmas {Name} = string 文件名字
 */
export const AlinkDownLoadFile = (url: string, Name: string) => {
  console.log(url, Name)

  let Alink = document.createElement("a")
  Alink.target = "_blank"
  Alink.download = Name
  Alink.href = url
  Alink.click()
}
